package com.zh.common.websocket;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * Class Name : ThmsWebSocketInterceptor<br/>
 * Description: Thms管理系统的webSocket拦截器，用作参数处理<br/>
 * Date       : 2017年12月7日<br/>
 *
 * @author lds
 * @Version V1.0.0
 * @since JDK 1.7
 *
 */
public class ThmsWebSocketInterceptor implements HandshakeInterceptor {

	@Override
	public void afterHandshake(ServerHttpRequest paramServerHttpRequest,
			ServerHttpResponse paramServerHttpResponse,
			WebSocketHandler paramWebSocketHandler, Exception paramException) {

	}

	/* 
	 *TODO:获取webSocket所传递的参数<br>
	 *	在通常使用中，对于于一个连接，主要考虑的是：1.当前请求的用户是谁？2.用户请求这个连接干什么<br>
	 *	再一般的系统中单角色系统中，只要用户连接上，然后按照消息类型不同推送给用户，客户端根据消息的不同类型进行消息分类<br>
	 *	但是这样做的话，消息的作用就和ajax类似，无法体现webSocket的优越性（全双工通信） <br>
	 *	所以我们尽可能的需要我们的webSocket支持双向的复杂数据交互， <br>
	 *	这时我们需要实现这个方法，将请求所带来的信息进行拦截处理成我们后面我们方便使用key-value形式<br>
	 * 
	 * 	request：ws请求<br>
	 *	 response：ws相应<br>
	 * 	WebSocketHandler： ws处理器<br>
	 * 	map：ws携带的参数<br>
	 * 
	 * 	所以从方法中可以看出，我们可以在此步完成复杂的数据接收和部分数据处理逻辑<br>
	 * 	目前本系统所实现的只有简单的用户和用户类型两个参数的转化（因为所有的系统都需要这两个参数），如果需要更多的参数可自行扩展。<br>
	 * 
	 */
	@Override
	public boolean beforeHandshake(ServerHttpRequest request,
			ServerHttpResponse response,
			WebSocketHandler paramWebSocketHandler, Map<String, Object> map)
			throws Exception {
		HttpServletRequest sshr =  ((ServletServerHttpRequest) request).getServletRequest();
		String userKey = sshr.getParameter("userKey");
		String userType = sshr.getParameter("userType");
		map.put("userKey", userKey);
		map.put("userType", userType);
		return true;
	}
}